'''
BeautifulSoup 将复杂的html文档转换成一个复杂的树形结构，每个节点都是python对象，所有的对象归纳为4种：
    Tag
    NavigableString
    BeautifulSoup
    Comment
'''
import re

from bs4 import BeautifulSoup
file = open("baidu.html", 'rb')
html = file.read().decode("utf-8")
bs = BeautifulSoup(html, "html.parser")  # 指定解析器：html.parser

'''
# 访问树形结构里的标签（title、a、head）及其内容，拿到所找到的第一个内容
print(bs.title)
print(bs.a)
print(bs.head)
print(type(bs.head))    # 结果：<class 'bs4.element.Tag'>


print(bs.title.string)  # 只访问内容
print(type(bs.title.string))   # 结果：<class 'bs4.element.NavigableString'> （标签里的内容为字符串类型）

print(bs.a.attrs) # 标签内容的属性

print(type(bs))  # 结果：<class 'bs4.BeautifulSoup'>

print(bs.name)  # 结果：[document]-整个文档
print(bs.attrs)  # 结果：{}-空字典，没有标签

# print(bs)  # 打印整个文档内容

print(bs.a.string)
print(type(bs.a.string)) 

# comment：是一个特殊的NavigableString，输出的内容不包含注释符号
'''
# ------------------------------------------------------------------------ 应用
# 文档的遍历*
# print(bs.head.contents[1])  # 返回的是一个列表，可以用下标索引[1]来获取想要的数据

# 更多内容，百度搜索BeautifulSoup文档

# 文档的搜索**

# 1、方法：find_all()，查找所有
# 字符串过滤：会查找与字符串完全匹配的内容
'''
t_list = bs.find_all("a")  # 把所有的超链接放在一个列表里

# 正则表达式搜索：使用方法find_all()来匹配内容
import re
t_list = bs.find_all(re.compile("a"))  # 这里会把标签及内容里含有a的都搜索出来  

'''

# 111 方法：传入一个函数（方法），根据函数的要求来搜索
'''
def name_is_exists(tag):
    return tag.has_attr("name")  # 传入tag，返回tag中标签name的属性
t_list = bs.find_all(name_is_exists)

for item in t_list:   # 打印出来更清晰有结果
    print(item)
'''


# 222 kwargs 参数
'''
# t_list = bs.find_all(id="head")
# t_list = bs.find_all(class_=True)  # class是python的关键字，所以要加下划线
t_list = bs.find_all(href="http://news.baidu.com")  # 搜索指定内容
for item in t_list:
    print(item)
'''
# 333 string 参数
'''
t_list = bs.find_all(string="hao123")
t_list = bs.find_all(string=["hao123", "地图", "贴吧"])
t_list = bs.fina_all(string=re.compile("\d"))  # 应用正则表达式来查找包含特定文本的内容（标签里的字符串）
for item in t_list:
    print(item)
'''
# 444 limit 参数
'''
t_list = bs.find_all("a", limit=3)  # 限定输出3个
for item in t_list:
    print(item)
'''
# css 选择器
'''
t_list = bs.select('title')          # 通过标签查找，比find_all()更灵活，不仅可以指定标签，还可以指定id等
t_list = bs.select(".mnav")          # 通过类名查找（. + 字符串）
t_list = bs.select("#u1")            # 通过id查找 （# + 字符串）
t_list = bs.select("a[class='pf']")  # 通过属性查找
t_list = bs.select("head > title")   # 通过子标签来查找
for item in t_list:
    print(item)
t_list = bs.select(".mnav ~ .bri")    # 通过兄弟节点标签来查找
print(t_list[0].get_text())
'''